package cc.rengu.igas.bomp.common.util;

import cc.rengu.igas.bomp.common.constant.BompAppParamConstant;
import cc.rengu.igas.bomp.common.constant.TableNameConstant;
import cc.rengu.igas.bomp.common.dao.BizTmpMapper;
import cc.rengu.igas.bomp.common.dao.MchntApexInfoMapper;
import cc.rengu.igas.bomp.common.dao.MchntImageInfoMapper;
import cc.rengu.igas.bomp.common.dao.impl.BizTmpMapperImpl;
import cc.rengu.igas.bomp.common.dao.impl.MchntApexInfoMapperImpl;
import cc.rengu.igas.bomp.common.dao.impl.MchntImageInfoMapperImpl;
import cc.rengu.igas.bomp.common.entity.*;
import cc.rengu.igas.bomp.common.enums.*;
import cc.rengu.igas.bomp.facade.bean.*;
import cc.rengu.igas.bomp.facade.enums.BompMchntStatusEnum;
import cc.rengu.igas.bomp.facade.request.MchntBaseInfoManageRequest;
import cc.rengu.igas.bomp.facade.request.MchntProdInfoManageRequest;
import cc.rengu.oltp.service.common.constant.AppConfigConstant;
import cc.rengu.oltp.service.common.constant.AppParamConstant;
import cc.rengu.oltp.service.common.constant.TreeNodeConstant;
import cc.rengu.oltp.service.common.enums.ChannelEnum;
import cc.rengu.oltp.service.model.BizException;
import cc.rengu.oltp.utility.util.*;
import cc.rengu.utility.log.RgLog;
import cc.rengu.utility.log.RgLogger;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.codec.binary.Base64;
import org.springframework.util.CollectionUtils;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author: zhangxuran
 * @Date: 2020/3/30 15:04
 * @Description: 初始化参数工具类
 */
public class InitParamUtil {

    public static final String yyyy_MM_dd_HHmmssSSS = "yyyy-MM-dd HH:mm:ss.SSS";
    private static final String DEFAULT_VERSION = "1.0.0";
    private static final String DEFAULT_BIZ_TYPE = "00";
    private static final String DEFAULT_SRC_SYS_ID = AppParamConstant.SYS_ID;
    private static final String DEFAULT_CHANNL_ID = ChannelEnum.BOMP.getChannelType();


    public static cc.rengu.igas.channel.alipay.facade.base.Header initAlipayHeader(String txnNum, String instId, String sysSeqNum) throws Exception {
        return (cc.rengu.igas.channel.alipay.facade.base.Header) initIgasHeader("channel.alipay", txnNum, instId, sysSeqNum);
    }

    public static cc.rengu.igas.channel.wechat.facade.base.Header initWechatHeader(String txnNum, String instId, String sysSeqNum) throws Exception {
        return (cc.rengu.igas.channel.wechat.facade.base.Header) initIgasHeader("channel.wechat", txnNum, instId, sysSeqNum);
    }

    public static Object initIgasHeader(String modelChannel, String txnNum, String instId, String traceNo) throws Exception {
        XmlTreeUtil xmlTreeUtil = new XmlTreeUtil();
        String transDate = xmlTreeUtil.getXmlTreeStringValue(TreeNodeConstant.HEADER_TRANS_DATE);
        if (StringUtil.isEmptyOrNull(transDate)) {
            transDate = xmlTreeUtil.getXmlTreeStringValue(TreeNodeConstant.TRANS_DATE);
            if (StringUtil.isEmptyOrNull(transDate)) {
                transDate = DateUtil.getCurrentDate();
            }
        }
        String transTime = xmlTreeUtil.getXmlTreeStringValue(TreeNodeConstant.HEADER_TRANS_TIME);
        if (StringUtil.isEmptyOrNull(transTime)) {
            transTime = xmlTreeUtil.getXmlTreeStringValue(TreeNodeConstant.TRANS_TIME);
            if (StringUtil.isEmptyOrNull(transTime)) {
                transTime = DateUtil.getCurrentTime();
            }
        }
        if (StringUtil.isEmptyOrNull(traceNo)) {
            traceNo = xmlTreeUtil.getXmlTreeStringValue(TreeNodeConstant.SYS_SEQ_NUM);
        }
        return initIgasHeader(modelChannel, DEFAULT_VERSION, transDate, transTime, txnNum, DEFAULT_BIZ_TYPE, instId, DEFAULT_SRC_SYS_ID, DEFAULT_CHANNL_ID, traceNo);
    }

    public static Object initIgasHeader(String modelChannel, String version, String transDate, String transTime, String txnNum, String bizType, String instId, String srcSysId, String chanlId, String traceNo) throws Exception {
        Class<?> headerClass = Class.forName("cc.rengu.igas." + modelChannel + ".facade.base.Header");
        Object header = headerClass.newInstance();
        Method setVersion = headerClass.getDeclaredMethod("setVersion", String.class);
        Method setTransDate = headerClass.getDeclaredMethod("setTransDate", String.class);
        Method setTransTime = headerClass.getDeclaredMethod("setTransTime", String.class);
        Method setTxnNum = headerClass.getDeclaredMethod("setTxnNum", String.class);
        Method setBizType = headerClass.getDeclaredMethod("setBizType", String.class);
        Method setInstId = headerClass.getDeclaredMethod("setInstId", String.class);
        Method setSrcSysId = headerClass.getDeclaredMethod("setSrcSysId", String.class);
        Method setChanlId = headerClass.getDeclaredMethod("setChanlId", String.class);
        Method setTraceNo = headerClass.getDeclaredMethod("setTraceNo", String.class);
        setVersion.invoke(header, version);
        setTransDate.invoke(header, transDate);
        setTransTime.invoke(header, transTime);
        setTxnNum.invoke(header, txnNum);
        setBizType.invoke(header, bizType);
        setInstId.invoke(header, instId);
        setSrcSysId.invoke(header, srcSysId);
        setChanlId.invoke(header, chanlId);
        setTraceNo.invoke(header, traceNo);
        return header;
    }
    //endregion

    //region 临时表相关

    /**
     * 转换临时表
     *
     * @param mchntBaseInfo mchntBaseInfo
     * @param tableName     tableName
     * @param bizOpr        bizOpr
     * @param tableObject   tableObject
     * @return 临时表
     * @throws Exception 异常
     */
    public static BizTmp initBizTmpInfo(MchntBaseInfo mchntBaseInfo, String tableName, String bizOpr, Object tableObject) throws Exception {
        RgLogger rglog = RgLog.getLogger(InitParamUtil.class.getName());
        BizTmp bizTmp = new BizTmp();

        Method getIdMethod = tableObject.getClass().getMethod("getId");
        String bizTmpId = (String) getIdMethod.invoke(tableObject);
        rglog.debug("转换临时表ID<{}>", bizTmpId);

        bizTmp.setRealId(bizTmpId);
        bizTmp.setInstId(mchntBaseInfo.getInstId());
        bizTmp.setMchntNo(mchntBaseInfo.getMchntNo());
        // bizTmp.setTermNo("终端编号,忽略");
        bizTmp.setOprMenuId(BompAppParamConstant.OPR_MENU_ID);
        bizTmp.setOprMenuName(BompAppParamConstant.OPR_MENU_NAME);
        // bizTmp.setOprTableCname("中文名,忽略");
        bizTmp.setOprTableEname(tableName);
        bizTmp.setWebNextUrl(BompAppParamConstant.WEB_NEXT_URL);
        if (TableNameConstant.T_B_MCHNT_BASE_INFO.equals(tableName)) {
            bizTmp.setDetailFlag(AppParamConstant.NO);
            bizTmp.setMasterShowFlag(AppParamConstant.YES);
        } else {
            bizTmp.setDetailFlag(AppParamConstant.YES);
            bizTmp.setMasterKey(mchntBaseInfo.getId());
            bizTmp.setMasterShowFlag(AppParamConstant.NO);
        }

        updateBizTmp(mchntBaseInfo, bizTmp, bizOpr, tableObject);
        return bizTmp;
    }

    public static void updateBizTmp(MchntBaseInfo mchntBaseInfo, BizTmp bizTmp, String bizOpr, Object tableObject) throws Exception {
        XmlTreeUtil xmlTreeUtil = new XmlTreeUtil();
        JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(tableObject));
        jsonObject.put("sysSeqNum", xmlTreeUtil.getXmlTreeStringValue(TreeNodeConstant.SYS_SEQ_NUM));

        bizTmp.setManageInstId(mchntBaseInfo.getSignInstId());
        bizTmp.setMchntName(mchntBaseInfo.getMchntName());
        bizTmp.setBizOpr(bizOpr);
        // bizTmp.setBizData1("↓");
        initBizTempData(bizTmp, JSONObject.toJSONString(tableObject));
        bizTmp.setBizStatus(mchntBaseInfo.getMchntStatus());
        bizTmp.setAuditStatus(mchntBaseInfo.getAuditStatus());

        bizTmp.setOprId(jsonObject.getString("oprId"));
        bizTmp.setCreateTime(jsonObject.getString("createTime"));
        bizTmp.setLastOprId(jsonObject.getString("lastOprId"));
        bizTmp.setLastUpdateTime(jsonObject.getString("lastUpdateTime"));
        bizTmp.setLastAuditId(jsonObject.getString("lastAuditId"));
        bizTmp.setLastAuditTime(jsonObject.getString("lastAuditTime"));
        bizTmp.setRemark1(xmlTreeUtil.getXmlTreeStringValue(TreeNodeConstant.SYS_SEQ_NUM));
    }

    public static BizTmp initBizTmp(MchntBaseInfo mchntBaseInfo,
                                    String id,
                                    String jsonString,
                                    String tableName,
                                    String auditStatus,
                                    String masterShowFlag,
                                    String detailFlag) {
        BizTmp bizTmp = new BizTmp();
        BeanUtil.beanCopy(mchntBaseInfo, bizTmp);
        bizTmp.setManageInstId(mchntBaseInfo.getSignInstId());
        bizTmp.setRealId(id);
        bizTmp.setOprTableEname(tableName);
        //状态非正式
        bizTmp.setBizStatus(BizTmpStatusEnum.NO_NORMAL.getType());
        //新增
        bizTmp.setBizOpr("I");
        bizTmp.setAuditStatus(auditStatus);
        //主记录标识
        bizTmp.setDetailFlag(detailFlag);
        bizTmp.setMasterShowFlag(masterShowFlag);
        bizTmp.setMasterKey(mchntBaseInfo.getId());
        initBizTempData(bizTmp, jsonString);
        return bizTmp;
    }

    /**
     * /**
     * 刷新临时表数据
     *
     * @param mchntBaseInfo 商户基本信息
     * @param bizTmpList    临时表列表
     * @param idMap         idMap
     * @throws Exception 异常
     */
    public static void refreshBizTmp(MchntBaseInfo mchntBaseInfo, List<BizTmp> bizTmpList, Map<String, String> idMap, RgLogger rglog) throws Exception {
        BizTmpMapper bizTmpMapper = new BizTmpMapperImpl();
        if (CollectionUtils.isEmpty(bizTmpList)) {
            rglog.error("未上送需刷新的临时表,默认拒绝");
            throw new BizException(RespCodeEnum.SYSTEM_BUSYNESS.getRespCode(), RespCodeEnum.SYSTEM_BUSYNESS.getRespDesc());
        }
        for (BizTmp bizTmp : bizTmpList) {
            int updateResult = bizTmpMapper.updateBizTmpByRealId(bizTmp);
            if (0 != updateResult) {
                rglog.debug("更新<{}>失败,尝试插入数据.", bizTmp.getRealId());
                bizTmp.setOprId(bizTmp.getLastOprId());
                bizTmp.setCreateTime(bizTmp.getLastUpdateTime());
                int insertResult = bizTmpMapper.insertBizTmp(bizTmp);
                if (0 != insertResult) {
                    rglog.error("更新和新增数据<{}>失败", bizTmp.getRealId());
                    throw new BizException(RespCodeEnum.SYSTEM_BUSYNESS.getRespCode(), RespCodeEnum.SYSTEM_BUSYNESS.getRespDesc());
                }
            }
        }

        checkDeleteBizTmp(mchntBaseInfo, idMap, rglog);
    }

    /**
     * 检查需要删除的临时表数据,并置为失效,需提前开启事务
     *
     * @param mchntBaseInfo 商户基本信息
     * @param idMap         idMap
     * @throws Exception 异常
     */
    private static void checkDeleteBizTmp(MchntBaseInfo mchntBaseInfo, Map<String, String> idMap, RgLogger rglog) throws Exception {
        rglog.info("更新商户临时表成功,开始排查临时表中存在但是未上送的信息,置为失效.");
        BizTmpMapper bizTmpMapper = new BizTmpMapperImpl();
        for (Map.Entry<String, String> id : idMap.entrySet()) {
            if ("0".equals(id.getValue())) {
                //如果map中还有value为0的信息,系前端未上送的信息,需将临时表中的数据置成失效
                rglog.debug("删除:id<{}>", id.getKey());
                BizTmp bizTmp = bizTmpMapper.selectBizTmpByRealId(mchntBaseInfo.getInstId(), id.getKey());
                if (null == bizTmp) {
                    rglog.error("未查询到欲删除的数据.");
                    throw new BizException(RespCodeEnum.SYSTEM_BUSYNESS.getRespCode(), RespCodeEnum.SYSTEM_BUSYNESS.getRespDesc());
                }
                JSONObject mchntObject = JSONObject.parseObject(getJsonString(bizTmp));
                mchntObject.put("recordStatus", AppParamConstant.NO);
                mchntObject.put("lastOprId", mchntBaseInfo.getLastOprId());
                mchntObject.put("lastUpdateTime", mchntBaseInfo.getLastUpdateTime());

                initBizTempData(bizTmp, JSONObject.toJSONString(mchntObject));
                bizTmp.setLastOprId(mchntBaseInfo.getLastOprId());
                bizTmp.setLastUpdateTime(mchntBaseInfo.getLastUpdateTime());
                int updateResult = bizTmpMapper.updateBizTmpByRealId(bizTmp);
                if (0 != updateResult) {
                    rglog.error("更新临时表<{}>失败.", bizTmp.getRealId());
                    throw new BizException(RespCodeEnum.SYSTEM_BUSYNESS.getRespCode(), RespCodeEnum.SYSTEM_BUSYNESS.getRespDesc());
                }
            }
        }
    }

    public static DbsUtil dbsBeginTransaction(String nodeName) throws Exception {
        XmlTreeUtil xmlTreeUtil = new XmlTreeUtil();
        /* 开启数据库事务 */
        String dbPoolName = XmlConfigUtil.getXmlConfigCacheKeyValue(AppConfigConstant.DATABASE_CONF_NODE, nodeName);
        String corporation = xmlTreeUtil.getXmlTreeStringValue(AppParamConstant.CORPORATION);
        if (null != corporation && !corporation.isEmpty()) {
            String dbPoolCashNode = corporation.trim() + AppParamConstant.DATABASE_CONF_NODE;
            dbPoolName = XmlConfigUtil.getXmlConfigCacheKeyValue(dbPoolCashNode, nodeName);
        }
        DbsUtil dbsUtil = new DbsUtil(dbPoolName);
        dbsUtil.dbsBeginTransaction();
        return dbsUtil;
    }

    /* 初始化商户基础信息表 商户入驻时使用
     *
     * @param mchntBaseInfoBean     商户基本信息
     * @param mchntContactsInfoBean 商户联系人信息
     * @param mchntNo               商户号
     * @param managerInfo           拓展经理
     */
    public static MchntBaseInfo initMchntBaseInfoByCreate(MchntBaseInfoBean mchntBaseInfoBean,
                                                          MchntContactsInfoBean mchntContactsInfoBean,
                                                          String mchntNo,
                                                          ManagerInfo managerInfo,
                                                          MchntBaseInfoManageRequest request) {
        MchntBaseInfo mchntBaseInfo = new MchntBaseInfo();
        BeanUtil.beanCopy(mchntBaseInfoBean, mchntBaseInfo);
        BeanUtil.beanCopy(mchntContactsInfoBean, mchntBaseInfo);
        mchntBaseInfo.setInstId(managerInfo.getInstId());
        //签约机构为拓展经理所属机构
        if (StringUtil.isEmptyOrNull(mchntBaseInfoBean.getSignInstId())) {
            mchntBaseInfo.setSignInstId(managerInfo.getSignInstId());
        } else {
            mchntBaseInfo.setSignInstId(mchntBaseInfoBean.getSignInstId());
        }
        mchntBaseInfo.setMchntContactName(mchntContactsInfoBean.getContactName());
        mchntBaseInfo.setMchntContactCertType(mchntContactsInfoBean.getContactCertType());
        mchntBaseInfo.setMchntContactCertNo(mchntContactsInfoBean.getContactCertNo());
        mchntBaseInfo.setMchntContactPhone(mchntContactsInfoBean.getContactPhone());
        mchntBaseInfo.setMchntContactMobile(mchntContactsInfoBean.getContactMobile());
        mchntBaseInfo.setMchntContactEmail(mchntContactsInfoBean.getContactEmail());
        //新增时默认填N
        mchntBaseInfo.setRealSettleFlag(BompAppParamConstant.FLAG_N);
        mchntBaseInfo.setCashWithdrawalFlag(BompAppParamConstant.FLAG_N);
        mchntBaseInfo.setMchntSettleMode("00");
        //商户拓展渠道
        mchntBaseInfo.setMchntExpandChannel(request.getHeader().getChanlId());
        mchntBaseInfo.setMchntNo(mchntNo);
        String id = RandomUtil.getUUID();
        mchntBaseInfo.setId(id);
        mchntBaseInfo.setOprId(managerInfo.getManagerId());
        mchntBaseInfo.setLastOprId(request.getUserId());
        //非正式商户
        mchntBaseInfo.setMchntStatus(BompMchntStatusEnum.NO_NORMAL.getType());
        //待提交审批
        mchntBaseInfo.setAuditStatus(AuditStatusEnum.BE_AUDIT.getAuditStatus());
        String time = DateUtil.getCurrentDateTime(yyyy_MM_dd_HHmmssSSS);
        mchntBaseInfo.setCreateTime(time);
        mchntBaseInfo.setLastUpdateTime(time);
        //申请时间
        mchntBaseInfo.setMchntApplyTime(time);
        //入驻时间 （新增）
        mchntBaseInfo.setMchntExpandTime(time);

        return mchntBaseInfo;
    }

    /**
     * 初始化商户基础信息表 商户入驻时使用
     *
     * @param mchntBaseInfoBean     商户基本信息
     * @param mchntContactsInfoBean 商户联系人信息
     * @param dbMchntBaseInfo       商户号
     * @param request               请求
     */
    public static MchntBaseInfo initMchntBaseInfoByCreateModify(MchntBaseInfoManageRequest request,
                                                                MchntBaseInfoBean mchntBaseInfoBean,
                                                                MchntContactsInfoBean mchntContactsInfoBean,
                                                                MchntBaseInfo dbMchntBaseInfo) {
        MchntBaseInfo mchntBaseInfo = new MchntBaseInfo();
        BeanUtil.beanCopy(dbMchntBaseInfo, mchntBaseInfo);
        BeanUtil.beanCopy(mchntBaseInfoBean, mchntBaseInfo);
        BeanUtil.beanCopy(mchntContactsInfoBean, mchntBaseInfo);
        mchntBaseInfo.setInstId(dbMchntBaseInfo.getInstId());
        mchntBaseInfo.setMchntNo(dbMchntBaseInfo.getMchntNo());
        mchntBaseInfo.setSignInstId(dbMchntBaseInfo.getSignInstId());
        mchntBaseInfo.setMchntContactName(mchntContactsInfoBean.getContactName());
        mchntBaseInfo.setMchntContactCertType(mchntContactsInfoBean.getContactCertType());
        mchntBaseInfo.setMchntContactCertNo(mchntContactsInfoBean.getContactCertNo());
        mchntBaseInfo.setMchntContactPhone(mchntContactsInfoBean.getContactPhone());
        mchntBaseInfo.setMchntContactMobile(mchntContactsInfoBean.getContactMobile());
        mchntBaseInfo.setMchntContactEmail(mchntContactsInfoBean.getContactEmail());
        mchntBaseInfo.setId(dbMchntBaseInfo.getId());
        mchntBaseInfo.setOprId(request.getUserId());
        mchntBaseInfo.setLastOprId(request.getUserId());
        //非正式商户
        mchntBaseInfo.setMchntStatus(BompMchntStatusEnum.NO_NORMAL.getType());
        //待提交审批
        mchntBaseInfo.setAuditStatus(AuditStatusEnum.BE_AUDIT.getAuditStatus());
        String time = DateUtil.getCurrentDateTime(yyyy_MM_dd_HHmmssSSS);
        mchntBaseInfo.setCreateTime(time);
        mchntBaseInfo.setLastUpdateTime(time);
        //申请时间
        mchntBaseInfo.setMchntApplyTime(time);
        //入驻时间 （新增）
        mchntBaseInfo.setMchntExpandTime(time);

        return mchntBaseInfo;
    }


    /**
     * 初始化商户基础信息表 商户入驻时使用
     *
     * @param mchntBaseInfoBean     商户基本信息
     * @param mchntContactsInfoBean 商户联系人信息
     * @param oldMchntBaseInfo      当前的商户基础信息
     */
    public static MchntBaseInfo initMchntBaseInfoByModify(MchntBaseInfoBean mchntBaseInfoBean,
                                                          MchntContactsInfoBean mchntContactsInfoBean,
                                                          MchntBaseInfo oldMchntBaseInfo,
                                                          String oprId, String auditStatus) {
        /* 商户名称、商户类型、商户性质、经营类目、联系人信息、营业执照信息、法人信息应该都不能修改，其他的应该都可以修改。 */
        MchntBaseInfo modifyMchntBaseInfo = new MchntBaseInfo();
        BeanUtil.beanCopy(oldMchntBaseInfo, modifyMchntBaseInfo);
        BeanUtil.beanCopy(mchntBaseInfoBean, modifyMchntBaseInfo);
        BeanUtil.beanCopy(mchntContactsInfoBean, modifyMchntBaseInfo);

        modifyMchntBaseInfo.setMchntContactName(mchntContactsInfoBean.getContactName());
        modifyMchntBaseInfo.setMchntContactCertType(mchntContactsInfoBean.getContactCertType());
        modifyMchntBaseInfo.setMchntContactCertNo(mchntContactsInfoBean.getContactCertNo());
        modifyMchntBaseInfo.setMchntContactPhone(mchntContactsInfoBean.getContactPhone());
        modifyMchntBaseInfo.setMchntContactMobile(mchntContactsInfoBean.getContactMobile());
        modifyMchntBaseInfo.setMchntContactEmail(mchntContactsInfoBean.getContactEmail());

        //不允许修改的字段，按原商户信息进行赋值
        modifyMchntBaseInfo.setMchntNature(oldMchntBaseInfo.getMchntNature());
        modifyMchntBaseInfo.setSignInstId(oldMchntBaseInfo.getSignInstId());
        modifyMchntBaseInfo.setMchntType(oldMchntBaseInfo.getMchntType());
        modifyMchntBaseInfo.setMchntExpandChannel(oldMchntBaseInfo.getMchntExpandChannel());
        modifyMchntBaseInfo.setChainMchntNo(oldMchntBaseInfo.getChainMchntNo());
        modifyMchntBaseInfo.setManagementScope(oldMchntBaseInfo.getManagementScope());
        modifyMchntBaseInfo.setIndustryType(oldMchntBaseInfo.getIndustryType());
        //下列数据不允许在商户基础信息页面修改，只能在结算账户页面进行修改  按原数据进行赋值
        modifyMchntBaseInfo.setCashWithdrawalFlag(oldMchntBaseInfo.getCashWithdrawalFlag());
        modifyMchntBaseInfo.setMchntSettleMode(oldMchntBaseInfo.getMchntSettleMode());
        modifyMchntBaseInfo.setRealSettleFlag(oldMchntBaseInfo.getRealSettleFlag());
        modifyMchntBaseInfo.setMchntDelayFlag(oldMchntBaseInfo.getMchntDelayFlag());
        modifyMchntBaseInfo.setMchntDelayResaon(oldMchntBaseInfo.getMchntDelayResaon());

        //修改待审核
        modifyMchntBaseInfo.setAuditStatus(auditStatus);
        modifyMchntBaseInfo.setLastOprId(oprId);
        modifyMchntBaseInfo.setLastUpdateTime(DateUtil.getCurrentDateTime(yyyy_MM_dd_HHmmssSSS));

        return modifyMchntBaseInfo;
    }

    /**
     * 初始化业务临时表的 bizData 数据
     */
    public static void initBizTempData(BizTmp bizTmp, String bizData) {
        if (bizData.length() <= 4000) {
            bizTmp.setBizData1(bizData);
        } else if (bizData.length() <= 8000) {
            bizTmp.setBizData1(bizData.substring(0, 4000));
            bizTmp.setBizData2(bizData.substring(4000, 8000));
        } else if (bizData.length() <= 12000) {
            bizTmp.setBizData1(bizData.substring(0, 4000));
            bizTmp.setBizData2(bizData.substring(4000, 8000));
            bizTmp.setBizData3(bizData.substring(8000));
        } else {
            //异常
            throw new BizException(RespCodeEnum.SYSTEM_ERROR.getRespCode(), RespCodeEnum.SYSTEM_ERROR.getRespDesc());
        }
    }

    /**
     * 初始化业务历史表的 bizData 数据
     */
    public static void initBizHistoryData(BizHistory bizHistory, String bizChangeData) {
        if (bizChangeData.length() <= 4000) {
            bizHistory.setBizChangeData1(bizChangeData);
        } else if (bizChangeData.length() <= 8000) {
            bizHistory.setBizChangeData1(bizChangeData.substring(0, 4000));
            bizHistory.setBizChangeData2(bizChangeData.substring(4000, 8000));
        } else if (bizChangeData.length() <= 12000) {
            bizHistory.setBizChangeData1(bizChangeData.substring(0, 4000));
            bizHistory.setBizChangeData2(bizChangeData.substring(4000, 8000));
            bizHistory.setBizChangeData3(bizChangeData.substring(8000));
        } else {
            //异常
            throw new BizException(RespCodeEnum.SYSTEM_ERROR.getRespCode(), RespCodeEnum.SYSTEM_ERROR.getRespDesc());
        }
    }

    /**
     * 初始化商户签约信息表 商户入驻时使用
     *
     * @param mchntArtifInfoBean      法人信息
     * @param businessLicenceInfoBean 执照信息
     * @param mchntNo                 商户号
     * @param oprId                   操作人
     */
    public static MchntSignInfo initMchntSignInfoByCreate(MchntArtifInfoBean mchntArtifInfoBean,
                                                          BusinessLicenceInfoBean businessLicenceInfoBean,
                                                          String mchntNo, String instId,
                                                          String oprId) {
        MchntSignInfo mchntSignInfo = new MchntSignInfo();
        BeanUtil.beanCopy(mchntArtifInfoBean, mchntSignInfo);
        BeanUtil.beanCopy(businessLicenceInfoBean, mchntSignInfo);
        mchntSignInfo.setMchntNo(mchntNo);
        mchntSignInfo.setInstId(instId);
        String id = RandomUtil.getUUID();
        mchntSignInfo.setId(id);
        mchntSignInfo.setOprId(oprId);
        //待提交审批
        mchntSignInfo.setAuditStatus(AuditStatusEnum.BE_AUDIT.getAuditStatus());
        mchntSignInfo.setRecordStatus(BompAppParamConstant.FLAG_Y);
        String time = DateUtil.getCurrentDateTime(yyyy_MM_dd_HHmmssSSS);
        mchntSignInfo.setCreateTime(time);
        return mchntSignInfo;
    }


    public static MchntSignInfo initMchntSignInfoByModify(MchntArtifInfoBean mchntArtifInfoBean,
                                                          BusinessLicenceInfoBean businessLicenceInfoBean,
                                                          MchntSignInfo oldMchntSignInfo,
                                                          String oprId, String auditStatus) {
        MchntSignInfo modifySignInfo = new MchntSignInfo();
        BeanUtil.beanCopy(oldMchntSignInfo, modifySignInfo);
        BeanUtil.beanCopy(mchntArtifInfoBean, modifySignInfo);
        BeanUtil.beanCopy(businessLicenceInfoBean, modifySignInfo);

        //以下数据不允许修改  营业执照类型，企业注册类型
        modifySignInfo.setLicenceType(oldMchntSignInfo.getLicenceType());
        modifySignInfo.setEnterRegisterType(oldMchntSignInfo.getEnterRegisterType());
        modifySignInfo.setArtifCertNo(oldMchntSignInfo.getArtifCertNo());
        modifySignInfo.setArtifCertType(oldMchntSignInfo.getArtifCertType());

        //修改待审核
        modifySignInfo.setAuditStatus(auditStatus);
        modifySignInfo.setLastOprId(oprId);
        return modifySignInfo;
    }


    public static MchntAcctInfo initMchntAcctInfoByCreate(MchntBaseInfo mchntBaseInfo,
                                                          String oprId,
                                                          SettleAcctInfoBean settleAcctInfoBean,
                                                          String time,
                                                          String auditStatus) {
        String id = RandomUtil.getUUID();
        MchntAcctInfo mchntAcctInfo = new MchntAcctInfo();
        BeanUtil.beanCopy(settleAcctInfoBean, mchntAcctInfo);
        mchntAcctInfo.setId(id);
        //结算账户默认“*”
        mchntAcctInfo.setBaseProdCode("*");
        mchntAcctInfo.setMchntNo(mchntBaseInfo.getMchntNo());
        mchntAcctInfo.setInstId(mchntBaseInfo.getInstId());
        mchntAcctInfo.setAcctOpenBankNo(settleAcctInfoBean.getSettleAcctBankNo());
        mchntAcctInfo.setAcctOpenBankName(settleAcctInfoBean.getSettleAcctBankName());
        mchntAcctInfo.setAcctOpenProvince(settleAcctInfoBean.getSettleAcctBankProvince());
        mchntAcctInfo.setAcctOpenCity(settleAcctInfoBean.getSettleAcctBankCity());
        mchntAcctInfo.setAcctOpenArea(settleAcctInfoBean.getSettleAcctBankArea());
        mchntAcctInfo.setOprId(oprId);
        mchntAcctInfo.setAuditStatus(auditStatus);
        mchntAcctInfo.setRecordStatus(BompAppParamConstant.FLAG_Y);
        mchntAcctInfo.setAcctSignFlag(BompAppParamConstant.FLAG_N);
        mchntAcctInfo.setCreateTime(time);
        return mchntAcctInfo;
    }

    /**
     * 初始化商户产品信息表 商户入驻时使用
     *
     * @param request 商户产品新增请求
     */
    public static MchntProdInfo initMchntProdInfoByCreate(MchntProdInfoManageRequest request,
                                                          BaseProdBean baseProdBean,
                                                          String auditStatus,
                                                          String createTime) {

        MchntProdInfo mchntProdInfo = new MchntProdInfo();
        mchntProdInfo.setId(RandomUtil.getUUID());
        mchntProdInfo.setInstId(request.getHeader().getInstId());
        mchntProdInfo.setMchntNo(request.getMchntNo());
        mchntProdInfo.setProdCode(request.getProdCode());
        mchntProdInfo.setBaseProdCode(baseProdBean.getBaseProdCode());

        mchntProdInfo.setWechatChannelId(request.getWechatChannelId());
        mchntProdInfo.setAlipayChannelId(request.getAlipayChannelId());
        mchntProdInfo.setRecordStatus(BompAppParamConstant.FLAG_Y);
        mchntProdInfo.setAuditStatus(auditStatus);
        mchntProdInfo.setCreateTime(createTime);
        mchntProdInfo.setOprId(request.getUserId());
        return mchntProdInfo;
    }

    /**
     * 初始化商户产品信息表 商户入驻时使用
     *
     * @param request 商户产品新增请求
     */
    public static MchntProdInfo initMchntProdInfoByCreateModify(MchntProdInfoManageRequest request,
                                                                BaseProdBean baseProdBean,
                                                                MchntProdInfo dbMchntProdInfo,
                                                                String auditStatus,
                                                                String createTime) {

        MchntProdInfo mchntProdInfo = new MchntProdInfo();
        BeanUtil.beanCopy(dbMchntProdInfo, mchntProdInfo);
        mchntProdInfo.setBaseProdCode(baseProdBean.getBaseProdCode());
        if (!StringUtil.isEmptyOrNull(request.getWechatChannelId())) {
            mchntProdInfo.setWechatChannelId(request.getWechatChannelId());
        }

        if (!StringUtil.isEmptyOrNull(request.getAlipayChannelId())) {
            mchntProdInfo.setAlipayChannelId(request.getAlipayChannelId());
        }
        mchntProdInfo.setRecordStatus(BompAppParamConstant.FLAG_Y);
        mchntProdInfo.setAuditStatus(auditStatus);

        mchntProdInfo.setLastUpdateTime(createTime);
        mchntProdInfo.setLastOprId(request.getUserId());
        return mchntProdInfo;
    }


    /**
     * 初始化商户费率信息 商户入驻时使用
     *
     * @param request 商户产品新增请求
     */
    public static MchntFeeInfo initMchntFeeInfoByCreate(MchntProdInfoManageRequest request,
                                                        String baseProdCode,
                                                        MchntFeeInfoBean mchntFeeInfoBean,
                                                        String auditStatus,
                                                        String createTime) throws Exception {
        MchntFeeInfo mchntFeeInfo = new MchntFeeInfo();
        mchntFeeInfo.setId(RandomUtil.getUUID());
        mchntFeeInfo.setInstId(request.getHeader().getInstId());
        mchntFeeInfo.setMchntNo(request.getMchntNo());
        mchntFeeInfo.setProdCode(request.getProdCode());
        mchntFeeInfo.setBaseProdCode(baseProdCode);
        mchntFeeInfo.setFeeType(mchntFeeInfoBean.getFeeType());
        mchntFeeInfo.setFeeInputMode(mchntFeeInfoBean.getFeeInputMode());
        mchntFeeInfo.setFeeCode(mchntFeeInfoBean.getFeeCode());
        if (!StringUtil.isEmptyOrNull(mchntFeeInfoBean.getFeeRate())) {
            AmountUtil.checkAmt(mchntFeeInfoBean.getFeeRate(), 2, false, true);
            mchntFeeInfo.setFeeRate(mchntFeeInfoBean.getFeeRate());
        }

        if (!StringUtil.isEmptyOrNull(mchntFeeInfoBean.getFeeCappingAmt())) {
            AmountUtil.checkAmt(mchntFeeInfoBean.getFeeCappingAmt(), 2, false, true);
            mchntFeeInfo.setFeeCappingAmt(mchntFeeInfoBean.getFeeCappingAmt());
        }

        if (!StringUtil.isEmptyOrNull(mchntFeeInfoBean.getFeeFixedAmt())) {
            AmountUtil.checkAmt(mchntFeeInfoBean.getFeeFixedAmt(), 2, false, true);
            mchntFeeInfo.setFeeFixedAmt(mchntFeeInfoBean.getFeeFixedAmt());
        }
        //创建的时候，默认生效日期为当天
        mchntFeeInfo.setFeeEffectiveDate(DateUtil.getCurrentDate());
        //创建时，默认失效日期为20991231
        mchntFeeInfo.setFeeExpiryDate(BompAppParamConstant.DEFAULT_EXPIRY_DATE);
        mchntFeeInfo.setRecordStatus(BompAppParamConstant.FLAG_Y);
        mchntFeeInfo.setAuditStatus(auditStatus);
        mchntFeeInfo.setCreateTime(createTime);
        mchntFeeInfo.setOprId(request.getUserId());
        return mchntFeeInfo;
    }

    /**
     * 初始化商户费率信息 商户入驻时使用
     *
     * @param request 商户产品新增请求
     */
    public static MchntFeeInfo initMchntFeeInfoByOnlyFee(MchntProdInfoManageRequest request,
                                                         String baseProdCode,
                                                         MchntFeeInfoBean mchntFeeInfoBean,
                                                         String feeType,
                                                         String auditStatus,
                                                         String createTime) {
        MchntFeeInfo mchntFeeInfo = new MchntFeeInfo();
        mchntFeeInfo.setId(RandomUtil.getUUID());
        mchntFeeInfo.setInstId(request.getHeader().getInstId());
        mchntFeeInfo.setMchntNo(request.getMchntNo());
        mchntFeeInfo.setProdCode(request.getProdCode());
        mchntFeeInfo.setBaseProdCode(baseProdCode);
        mchntFeeInfo.setFeeType(feeType);
        mchntFeeInfo.setFeeInputMode(mchntFeeInfoBean.getFeeInputMode());
        mchntFeeInfo.setFeeCode(mchntFeeInfoBean.getFeeCode());
        mchntFeeInfo.setFeeRate(mchntFeeInfoBean.getFeeRate());
        mchntFeeInfo.setFeeCappingAmt(mchntFeeInfoBean.getFeeCappingAmt());
        mchntFeeInfo.setFeeFixedAmt(mchntFeeInfoBean.getFeeFixedAmt());
        mchntFeeInfo.setFeeEffectiveDate(DateUtil.getCurrentDate());
        mchntFeeInfo.setFeeExpiryDate(BompAppParamConstant.DEFAULT_EXPIRY_DATE);
        mchntFeeInfo.setRecordStatus(BompAppParamConstant.FLAG_Y);
        mchntFeeInfo.setAuditStatus(auditStatus);
        mchntFeeInfo.setCreateTime(createTime);
        mchntFeeInfo.setOprId(request.getUserId());
        return mchntFeeInfo;
    }


    /**
     * 初始化商户费率信息 商户入驻时使用
     *
     * @param request 商户产品新增请求
     */
    public static MchntFeeInfo initMchntFeeInfoByCreateModify(MchntProdInfoManageRequest request,
                                                              MchntFeeInfo dbMchntFeeInfo,
                                                              MchntFeeInfoBean mchntFeeInfoBean,
                                                              String auditStatus,
                                                              String createTime) throws Exception {
        MchntFeeInfo mchntFeeInfo = new MchntFeeInfo();
        BeanUtil.beanCopy(dbMchntFeeInfo, mchntFeeInfo);
        mchntFeeInfo.setFeeType(mchntFeeInfoBean.getFeeType());
        mchntFeeInfo.setFeeInputMode(mchntFeeInfoBean.getFeeInputMode());
        mchntFeeInfo.setFeeCode(mchntFeeInfoBean.getFeeCode());
        if (!StringUtil.isEmptyOrNull(mchntFeeInfoBean.getFeeRate())) {
            AmountUtil.checkAmt(mchntFeeInfoBean.getFeeRate(), 2, false, true);
            mchntFeeInfo.setFeeRate(mchntFeeInfoBean.getFeeRate());
        }

        if (!StringUtil.isEmptyOrNull(mchntFeeInfoBean.getFeeCappingAmt())) {
            AmountUtil.checkAmt(mchntFeeInfoBean.getFeeCappingAmt(), 2, false, true);
            mchntFeeInfo.setFeeCappingAmt(mchntFeeInfoBean.getFeeCappingAmt());
        }

        if (!StringUtil.isEmptyOrNull(mchntFeeInfoBean.getFeeFixedAmt())) {
            AmountUtil.checkAmt(mchntFeeInfoBean.getFeeFixedAmt(), 2, false, true);
            mchntFeeInfo.setFeeFixedAmt(mchntFeeInfoBean.getFeeFixedAmt());
        }
        mchntFeeInfo.setFeeRate(mchntFeeInfoBean.getFeeRate());
        mchntFeeInfo.setFeeCappingAmt(mchntFeeInfoBean.getFeeCappingAmt());
        mchntFeeInfo.setFeeFixedAmt(mchntFeeInfoBean.getFeeFixedAmt());
        mchntFeeInfo.setFeeEffectiveDate(DateUtil.getCurrentDate());
        mchntFeeInfo.setFeeExpiryDate(BompAppParamConstant.DEFAULT_EXPIRY_DATE);
        mchntFeeInfo.setRecordStatus(BompAppParamConstant.FLAG_Y);
        mchntFeeInfo.setAuditStatus(auditStatus);

        mchntFeeInfo.setLastUpdateTime(createTime);
        mchntFeeInfo.setLastOprId(request.getUserId());
        return mchntFeeInfo;
    }

    /**
     * 初始化商户提现费率信息
     */
    public static MchntFeeInfo initMchntFeeInfoByCastWithdraw(CashWithdrawalFeeInfoBean cashWithdrawalFeeInfoBean,
                                                              MchntBaseInfo mchntBaseInfo,
                                                              String auditStatus,
                                                              String createTime,
                                                              String oprId) throws Exception {
        MchntFeeInfo mchntFeeInfo = new MchntFeeInfo();
        mchntFeeInfo.setId(RandomUtil.getUUID());
        mchntFeeInfo.setInstId(mchntBaseInfo.getInstId());
        mchntFeeInfo.setMchntNo(mchntBaseInfo.getMchntNo());
//        mchntFeeInfo.setProdCode(cashWithdrawalFeeInfoBean.getProdCode());
        mchntFeeInfo.setBaseProdCode(cashWithdrawalFeeInfoBean.getBaseProdCode());
        mchntFeeInfo.setFeeType(cashWithdrawalFeeInfoBean.getFeeType());
        mchntFeeInfo.setFeeInputMode(cashWithdrawalFeeInfoBean.getFeeInputMode());
        mchntFeeInfo.setFeeCode(cashWithdrawalFeeInfoBean.getFeeCode());
        mchntFeeInfo.setFeeRate(cashWithdrawalFeeInfoBean.getFeeRate());
        mchntFeeInfo.setFeeCappingAmt(cashWithdrawalFeeInfoBean.getFeeCappingAmt());
        mchntFeeInfo.setFeeFixedAmt(cashWithdrawalFeeInfoBean.getFeeFixedAmt());
        if (!StringUtil.isEmptyOrNull(cashWithdrawalFeeInfoBean.getFeeRate())) {
            AmountUtil.checkAmt(cashWithdrawalFeeInfoBean.getFeeRate(), 2, false, true);
            mchntFeeInfo.setFeeRate(cashWithdrawalFeeInfoBean.getFeeRate());
        }

        if (!StringUtil.isEmptyOrNull(cashWithdrawalFeeInfoBean.getFeeCappingAmt())) {
            AmountUtil.checkAmt(cashWithdrawalFeeInfoBean.getFeeCappingAmt(), 2, false, true);
            mchntFeeInfo.setFeeCappingAmt(cashWithdrawalFeeInfoBean.getFeeCappingAmt());
        }

        if (!StringUtil.isEmptyOrNull(cashWithdrawalFeeInfoBean.getFeeFixedAmt())) {
            AmountUtil.checkAmt(cashWithdrawalFeeInfoBean.getFeeFixedAmt(), 2, false, true);
            mchntFeeInfo.setFeeFixedAmt(cashWithdrawalFeeInfoBean.getFeeFixedAmt());
        }
        mchntFeeInfo.setFeeEffectiveDate(DateUtil.getFutureDay(1));
        mchntFeeInfo.setFeeExpiryDate(BompAppParamConstant.DEFAULT_EXPIRY_DATE);
        mchntFeeInfo.setRecordStatus(BompAppParamConstant.FLAG_Y);
        mchntFeeInfo.setAuditStatus(auditStatus);
        mchntFeeInfo.setCreateTime(createTime);
        mchntFeeInfo.setOprId(oprId);
        return mchntFeeInfo;
    }

    /**
     * 初始化商户提现费率信息
     */
    public static MchntFeeInfo initMchntFeeInfoByCreateCastWithdraw(CashWithdrawalFeeInfoBean cashWithdrawalFeeInfoBean,
                                                                    MchntBaseInfo mchntBaseInfo,
                                                                    String auditStatus,
                                                                    String createTime,
                                                                    String oprId) {
        MchntFeeInfo mchntFeeInfo = new MchntFeeInfo();
        mchntFeeInfo.setId(RandomUtil.getUUID());
        mchntFeeInfo.setInstId(mchntBaseInfo.getInstId());
        mchntFeeInfo.setMchntNo(mchntBaseInfo.getMchntNo());
//        mchntFeeInfo.setProdCode(cashWithdrawalFeeInfoBean.getProdCode());
        mchntFeeInfo.setBaseProdCode(cashWithdrawalFeeInfoBean.getBaseProdCode());
        mchntFeeInfo.setFeeType(cashWithdrawalFeeInfoBean.getFeeType());
        mchntFeeInfo.setFeeInputMode(cashWithdrawalFeeInfoBean.getFeeInputMode());
        mchntFeeInfo.setFeeCode(cashWithdrawalFeeInfoBean.getFeeCode());
        mchntFeeInfo.setFeeRate(cashWithdrawalFeeInfoBean.getFeeRate());
        mchntFeeInfo.setFeeCappingAmt(cashWithdrawalFeeInfoBean.getFeeCappingAmt());
        mchntFeeInfo.setFeeFixedAmt(cashWithdrawalFeeInfoBean.getFeeFixedAmt());
        //第一次创建时，当天生效
        mchntFeeInfo.setFeeEffectiveDate(DateUtil.getCurrentDate());
        mchntFeeInfo.setFeeExpiryDate(BompAppParamConstant.DEFAULT_EXPIRY_DATE);
        mchntFeeInfo.setRecordStatus(BompAppParamConstant.FLAG_Y);
        mchntFeeInfo.setAuditStatus(auditStatus);
        mchntFeeInfo.setCreateTime(createTime);
        mchntFeeInfo.setOprId(oprId);
        return mchntFeeInfo;
    }


    /**
     * 初始化商户费率信息 商户入驻时使用
     *
     * @param request 商户产品新增请求
     */
    public static MchntFeeInfo initMchntFeeInfoByProdFeeInfo(MchntProdInfoManageRequest request,
                                                             String baseProdCode,
                                                             ProdFeeInfo prodFeeInfo,
                                                             String auditStatus,
                                                             String createTime) {
        MchntFeeInfo mchntFeeInfo = new MchntFeeInfo();
        mchntFeeInfo.setId(RandomUtil.getUUID());
        mchntFeeInfo.setInstId(request.getHeader().getInstId());
        mchntFeeInfo.setMchntNo(request.getMchntNo());
        mchntFeeInfo.setProdCode(request.getProdCode());
        mchntFeeInfo.setBaseProdCode(baseProdCode);
        mchntFeeInfo.setFeeType(prodFeeInfo.getFeeType());
        mchntFeeInfo.setFeeInputMode(prodFeeInfo.getFeeInputMode());
        mchntFeeInfo.setFeeCode(prodFeeInfo.getFeeCode());
        mchntFeeInfo.setFeeRate(prodFeeInfo.getFeeRate());
        mchntFeeInfo.setFeeCappingAmt(prodFeeInfo.getFeeCappingAmt());
        mchntFeeInfo.setFeeFixedAmt(prodFeeInfo.getFeeFixedAmt());

        mchntFeeInfo.setFeeEffectiveDate(DateUtil.getCurrentDate());
        mchntFeeInfo.setFeeExpiryDate(BompAppParamConstant.DEFAULT_EXPIRY_DATE);
        mchntFeeInfo.setRecordStatus(BompAppParamConstant.FLAG_Y);
        mchntFeeInfo.setAuditStatus(auditStatus);
        mchntFeeInfo.setCreateTime(createTime);
        mchntFeeInfo.setOprId(request.getUserId());
        return mchntFeeInfo;
    }

    /**
     * 初始化商户费率信息 商户入驻时使用
     *
     * @param request 商户产品新增请求
     */
    public static MchntFeeInfo initMchntFeeInfoByProdFeeInfoModify(MchntProdInfoManageRequest request,
                                                                   String baseProdCode,
                                                                   ProdFeeInfo prodFeeInfo,
                                                                   String auditStatus,
                                                                   String createTime) {
        MchntFeeInfo mchntFeeInfo = new MchntFeeInfo();
        mchntFeeInfo.setId(RandomUtil.getUUID());
        mchntFeeInfo.setInstId(request.getHeader().getInstId());
        mchntFeeInfo.setMchntNo(request.getMchntNo());
        mchntFeeInfo.setProdCode(request.getProdCode());
        mchntFeeInfo.setBaseProdCode(baseProdCode);
        mchntFeeInfo.setFeeType(prodFeeInfo.getFeeType());
        mchntFeeInfo.setFeeInputMode(prodFeeInfo.getFeeInputMode());
        mchntFeeInfo.setFeeCode(prodFeeInfo.getFeeCode());
        mchntFeeInfo.setFeeRate(prodFeeInfo.getFeeRate());
        mchntFeeInfo.setFeeCappingAmt(prodFeeInfo.getFeeCappingAmt());
        mchntFeeInfo.setFeeFixedAmt(prodFeeInfo.getFeeFixedAmt());
        // 生效日期与失效日期  修改统一由明天生效
        mchntFeeInfo.setFeeEffectiveDate(DateUtil.getFutureDay(1));
        mchntFeeInfo.setFeeExpiryDate(BompAppParamConstant.DEFAULT_EXPIRY_DATE);
        mchntFeeInfo.setRecordStatus(BompAppParamConstant.FLAG_Y);
        mchntFeeInfo.setAuditStatus(auditStatus);
        mchntFeeInfo.setCreateTime(createTime);
        mchntFeeInfo.setOprId(request.getUserId());
        return mchntFeeInfo;
    }

    /**
     * 初始化商户分期信息表 商户入驻时使用
     *
     * @param request 商户产品新增请求
     */
    public static MchntStageInfo initMchntStageInfoByCreate(MchntProdInfoManageRequest request,
                                                            String baseProdCode,
                                                            MchntStageInfoBean mchntStageInfoBean,
                                                            String auditStatus,
                                                            String createTime) {
        MchntStageInfo mchntStageInfo = new MchntStageInfo();
        BeanUtil.beanCopy(mchntStageInfoBean, mchntStageInfo);
        mchntStageInfo.setId(RandomUtil.getUUID());
        mchntStageInfo.setInstId(request.getHeader().getInstId());
        mchntStageInfo.setMchntNo(request.getMchntNo());
        mchntStageInfo.setProdCode(request.getProdCode());
        mchntStageInfo.setBaseProdCode(baseProdCode);
        mchntStageInfo.setMchntStageNum(mchntStageInfoBean.getMchntStageNum());
        mchntStageInfo.setMchntStageFee(mchntStageInfoBean.getMchntStageFee());
        mchntStageInfo.setProdStageName(mchntStageInfoBean.getProdStageName());
        mchntStageInfo.setProdStageFeeType(mchntStageInfoBean.getProdStageFeeType());
        mchntStageInfo.setFeeEffectiveDate(DateUtil.getCurrentDate());
        //商户号(mchnt_no) + 基础产品代码(base_prod_code) + 分期产品代码(prod_stage_code) +分期期数(mchnt_stage_num) + 费率生效日期(fee_effective_date)
        String stagePrimaryKey = request.getMchntNo() + baseProdCode
                + mchntStageInfoBean.getProdStageCode()
                + mchntStageInfoBean.getMchntStageNum()
                + mchntStageInfo.getFeeEffectiveDate();
        mchntStageInfo.setStagePrimaryKey(stagePrimaryKey);
        mchntStageInfo.setFeeExpiryDate(BompAppParamConstant.DEFAULT_EXPIRY_DATE);
        mchntStageInfo.setRecordStatus(BompAppParamConstant.FLAG_Y);
        mchntStageInfo.setAuditStatus(auditStatus);
        mchntStageInfo.setOprId(request.getUserId());
        mchntStageInfo.setCreateTime(createTime);
        if (AppParamConstant.NO.equals(mchntStageInfoBean.getRecordStatus())) {
            mchntStageInfo.setRecordStatus(BompAppParamConstant.FLAG_N);
        }

        return mchntStageInfo;
    }

    /**
     * 初始化商户分期信息表 商户入驻时使用
     *
     * @param request 商户产品新增拒绝后修改请求
     */
    public static MchntStageInfo initMchntStageInfoByCreateModify(MchntProdInfoManageRequest request,
                                                                  MchntStageInfo dbMchntStageInfo,
                                                                  MchntStageInfoBean mchntStageInfoBean,
                                                                  String auditStatus,
                                                                  String createTime) {
        //商户号(mchnt_no) + 基础产品代码(base_prod_code) + 分期产品代码(prod_stage_code) +
        // 分期期数(mchnt_stage_num) + 费率生效日期(fee_effective_date)
        MchntStageInfo mchntStageInfo = new MchntStageInfo();
        BeanUtil.beanCopy(dbMchntStageInfo, mchntStageInfo);
        mchntStageInfo.setId(dbMchntStageInfo.getId());
        mchntStageInfo.setInstId(dbMchntStageInfo.getInstId());
        mchntStageInfo.setMchntNo(dbMchntStageInfo.getMchntNo());
        mchntStageInfo.setProdCode(dbMchntStageInfo.getProdCode());
        mchntStageInfo.setBaseProdCode(dbMchntStageInfo.getBaseProdCode());
        mchntStageInfo.setMchntStageNum(mchntStageInfoBean.getMchntStageNum());
        mchntStageInfo.setMchntStageFee(mchntStageInfoBean.getMchntStageFee());
        mchntStageInfo.setProdStageName(mchntStageInfoBean.getProdStageName());
        mchntStageInfo.setProdStageFeeType(mchntStageInfoBean.getProdStageFeeType());
        mchntStageInfo.setFeeEffectiveDate(DateUtil.getCurrentDate());
        String stagePrimaryKey = request.getMchntNo() + mchntStageInfo.getBaseProdCode()
                + mchntStageInfo.getProdStageCode()
                + mchntStageInfo.getMchntStageNum()
                + mchntStageInfo.getFeeEffectiveDate();
        mchntStageInfo.setStagePrimaryKey(stagePrimaryKey);
        mchntStageInfo.setFeeExpiryDate(BompAppParamConstant.DEFAULT_EXPIRY_DATE);
        mchntStageInfo.setRecordStatus(BompAppParamConstant.FLAG_Y);
        mchntStageInfo.setAuditStatus(auditStatus);
        if (AppParamConstant.NO.equals(mchntStageInfoBean.getRecordStatus())) {
            mchntStageInfo.setRecordStatus(BompAppParamConstant.FLAG_N);
        }

        mchntStageInfo.setLastUpdateTime(createTime);
        mchntStageInfo.setLastOprId(request.getUserId());

        return mchntStageInfo;
    }

    /**
     * 初始化商户分期信息表 商户入驻时使用
     *
     * @param request 商户产品新增请求
     */
    public static MchntStageInfo initMchntStageInfoByProdStageInfo(MchntProdInfoManageRequest request,
                                                                   String baseProdCode,
                                                                   ProdStageInfo prodStageInfo,
                                                                   String auditStatus,
                                                                   String createTime) {
        //商户号(mchnt_no) + 基础产品代码(base_prod_code) + 分期产品代码(prod_stage_code) +
        // 分期期数(mchnt_stage_num) + 费率生效日期(fee_effective_date)
        MchntStageInfo mchntStageInfo = new MchntStageInfo();
        mchntStageInfo.setId(RandomUtil.getUUID());
        mchntStageInfo.setInstId(request.getHeader().getInstId());
        mchntStageInfo.setMchntNo(request.getMchntNo());
        mchntStageInfo.setProdCode(request.getProdCode());
        mchntStageInfo.setBaseProdCode(baseProdCode);
        mchntStageInfo.setProdStageCode(prodStageInfo.getProdStageCode());
        mchntStageInfo.setMchntStageNum(prodStageInfo.getProdStageNum());
        mchntStageInfo.setMchntStageFee(prodStageInfo.getProdStageFee());
        mchntStageInfo.setProdStageName(prodStageInfo.getProdStageName());
        mchntStageInfo.setProdStageFeeType(prodStageInfo.getProdStageFeeType());
        mchntStageInfo.setFeeEffectiveDate(DateUtil.getCurrentDate());
        String stagePrimaryKey = request.getMchntNo() + baseProdCode
                + prodStageInfo.getProdStageCode()
                + prodStageInfo.getProdStageNum()
                + mchntStageInfo.getFeeEffectiveDate();
        mchntStageInfo.setStagePrimaryKey(stagePrimaryKey);
        mchntStageInfo.setFeeExpiryDate(BompAppParamConstant.DEFAULT_EXPIRY_DATE);
        mchntStageInfo.setRecordStatus(BompAppParamConstant.FLAG_Y);
        mchntStageInfo.setAuditStatus(auditStatus);
        mchntStageInfo.setOprId(request.getUserId());
        mchntStageInfo.setCreateTime(createTime);

        return mchntStageInfo;
    }

    /**
     * 初始化商户分期信息表 商户入驻时使用
     *
     * @param request 商户产品新增请求
     */
    public static MchntStageInfo initMchntStageInfoByProdStageInfoModify(MchntProdInfoManageRequest request,
                                                                         String baseProdCode,
                                                                         ProdStageInfo prodStageInfo,
                                                                         String auditStatus,
                                                                         String createTime) {
        //商户号(mchnt_no) + 基础产品代码(base_prod_code) + 分期产品代码(prod_stage_code) +
        // 分期期数(mchnt_stage_num) + 费率生效日期(fee_effective_date)
        MchntStageInfo mchntStageInfo = new MchntStageInfo();
        mchntStageInfo.setId(RandomUtil.getUUID());
        mchntStageInfo.setInstId(request.getHeader().getInstId());
        mchntStageInfo.setMchntNo(request.getMchntNo());
        mchntStageInfo.setProdCode(request.getProdCode());
        mchntStageInfo.setBaseProdCode(baseProdCode);
        mchntStageInfo.setProdStageCode(prodStageInfo.getProdStageCode());
        mchntStageInfo.setMchntStageNum(prodStageInfo.getProdStageNum());
        mchntStageInfo.setMchntStageFee(prodStageInfo.getProdStageFee());
        mchntStageInfo.setProdStageName(prodStageInfo.getProdStageName());
        mchntStageInfo.setProdStageFeeType(prodStageInfo.getProdStageFeeType());
        mchntStageInfo.setFeeEffectiveDate(DateUtil.getFutureDay(1));
        String stagePrimaryKey = request.getMchntNo() + baseProdCode
                + prodStageInfo.getProdStageCode()
                + prodStageInfo.getProdStageNum()
                + mchntStageInfo.getFeeEffectiveDate();
        mchntStageInfo.setStagePrimaryKey(stagePrimaryKey);
        mchntStageInfo.setFeeExpiryDate(BompAppParamConstant.DEFAULT_EXPIRY_DATE);
        mchntStageInfo.setRecordStatus(BompAppParamConstant.FLAG_Y);
        mchntStageInfo.setAuditStatus(auditStatus);
        mchntStageInfo.setOprId(request.getUserId());
        mchntStageInfo.setCreateTime(createTime);

        return mchntStageInfo;
    }


    /**
     * 初始化商户业务权限控制表 商户入驻时使用
     *
     * @param request 商户产品新增请求
     */
    public static MchntAuthCtrl initMchntAuthCtrlByCreate(MchntProdInfoManageRequest request,
                                                          String baseProdCode,
                                                          MchntAuthCtrlInfoBean mchntAuthCtrlInfoBean,
                                                          String auditStatus,
                                                          String createTime) {
        MchntAuthCtrl mchntAuthCtrl = new MchntAuthCtrl();
        mchntAuthCtrl.setId(RandomUtil.getUUID());
        mchntAuthCtrl.setInstId(request.getHeader().getInstId());
        //控制类型商户
        mchntAuthCtrl.setCtrlType("MCHNT");
        mchntAuthCtrl.setMchntNo(request.getMchntNo());
        //当控制类型为MCHNT时，填写*
        mchntAuthCtrl.setTermNo("*");
        mchntAuthCtrl.setTxnNum(mchntAuthCtrlInfoBean.getTxnNum());
        mchntAuthCtrl.setTxnName(mchntAuthCtrlInfoBean.getTxnName());
        mchntAuthCtrl.setBizType(mchntAuthCtrlInfoBean.getBizType());
        mchntAuthCtrl.setBizProdCode(baseProdCode);
        mchntAuthCtrl.setTxnGroup(mchntAuthCtrlInfoBean.getTxnGroup());
        mchntAuthCtrl.setSupportAcctType(mchntAuthCtrlInfoBean.getSupportAcctType());
        mchntAuthCtrl.setSupportFlag(mchntAuthCtrlInfoBean.getSupportFlag());
        mchntAuthCtrl.setAuditStatus(auditStatus);
        mchntAuthCtrl.setOprId(request.getUserId());
        mchntAuthCtrl.setCreateTime(createTime);

        return mchntAuthCtrl;
    }


    /**
     * 初始化商户业务权限控制表 商户入驻时使用
     *
     * @param request 商户产品新增请求
     */
    public static MchntAuthCtrl initMchntAuthCtrlByCreateModify(MchntProdInfoManageRequest request,
                                                                MchntAuthCtrl dbMchntAuthCtrl,
                                                                MchntAuthCtrlInfoBean mchntAuthCtrlInfoBean,
                                                                String auditStatus,
                                                                String createTime) {
        MchntAuthCtrl mchntAuthCtrl = new MchntAuthCtrl();
        BeanUtil.beanCopy(dbMchntAuthCtrl, mchntAuthCtrl);
        mchntAuthCtrl.setId(dbMchntAuthCtrl.getId());
        mchntAuthCtrl.setInstId(dbMchntAuthCtrl.getInstId());
        //控制类型商户
        mchntAuthCtrl.setCtrlType(dbMchntAuthCtrl.getCtrlType());
        mchntAuthCtrl.setMchntNo(dbMchntAuthCtrl.getMchntNo());
        //当控制类型为MCHNT时，填写*
        mchntAuthCtrl.setTermNo(dbMchntAuthCtrl.getTermNo());
        mchntAuthCtrl.setTxnNum(mchntAuthCtrlInfoBean.getTxnNum());
        mchntAuthCtrl.setTxnName(mchntAuthCtrlInfoBean.getTxnName());
        mchntAuthCtrl.setBizType(mchntAuthCtrlInfoBean.getBizType());
        mchntAuthCtrl.setBizProdCode(mchntAuthCtrlInfoBean.getBaseProdCode());
        mchntAuthCtrl.setTxnGroup(mchntAuthCtrlInfoBean.getTxnGroup());
        mchntAuthCtrl.setSupportAcctType(mchntAuthCtrlInfoBean.getSupportAcctType());
        mchntAuthCtrl.setSupportFlag(mchntAuthCtrlInfoBean.getSupportFlag());
        mchntAuthCtrl.setAuditStatus(auditStatus);
        mchntAuthCtrl.setLastUpdateTime(createTime);
        mchntAuthCtrl.setLastOprId(request.getUserId());

        return mchntAuthCtrl;
    }


    /**
     * 初始化商户业务权限控制表 商户入驻时使用
     *
     * @param request 商户产品新增请求
     */
    public static MchntAuthCtrl initMchntAuthCtrlByProdAuthCtrl(MchntProdInfoManageRequest request,
                                                                String baseProdCode,
                                                                ProdAuthCtrl prodAuthCtrl,
                                                                String auditStatus,
                                                                String createTime) {
        MchntAuthCtrl mchntAuthCtrl = new MchntAuthCtrl();
        mchntAuthCtrl.setId(RandomUtil.getUUID());
        mchntAuthCtrl.setInstId(request.getHeader().getInstId());
        //控制类型商户
        mchntAuthCtrl.setCtrlType("MCHNT");
        mchntAuthCtrl.setMchntNo(request.getMchntNo());
        //当控制类型为MCHNT时，填写*
        mchntAuthCtrl.setTermNo("*");
        mchntAuthCtrl.setTxnNum(prodAuthCtrl.getTxnNum());
        mchntAuthCtrl.setTxnName(prodAuthCtrl.getTxnName());
        mchntAuthCtrl.setBizType(prodAuthCtrl.getBizType());
        mchntAuthCtrl.setBizProdCode(baseProdCode);
        mchntAuthCtrl.setTxnGroup(prodAuthCtrl.getTxnGroup());
        mchntAuthCtrl.setSupportAcctType(prodAuthCtrl.getSupportAcctType());
        mchntAuthCtrl.setSupportFlag(prodAuthCtrl.getSupportFlag());
        mchntAuthCtrl.setAuditStatus(auditStatus);
        mchntAuthCtrl.setOprId(request.getUserId());
        mchntAuthCtrl.setCreateTime(createTime);

        return mchntAuthCtrl;
    }

    /**
     * 初始化微信商户信息表 商户入驻时使用
     *
     * @param request 商户产品新增请求
     */
    public static WechatMchntInfo initWechatMchntInfoByCreate(MchntProdInfoManageRequest request,
                                                              MchntBaseInfo mchntBaseInfo,
                                                              IndustryMapInfo industryMapInfo,
                                                              String appId,
                                                              String appKey,
                                                              String miniAppId,
                                                              String miniAppKey,
                                                              String independentEntryFlag,
                                                              String auditStatus,
                                                              String createTime) {
        WechatMchntInfo wechatMchntInfo = new WechatMchntInfo();
        wechatMchntInfo.setId(RandomUtil.getUUID());
        wechatMchntInfo.setInstId(request.getHeader().getInstId());
        wechatMchntInfo.setMchntNo(request.getMchntNo());


        //微信一级类目
        wechatMchntInfo.setWechatFirstCategory(industryMapInfo.getDestCatalogCd().length() <= 2 ? industryMapInfo.getDestCatalogCd() : industryMapInfo.getDestCatalogCd().substring(0, 2));
        //微信二级类目
        wechatMchntInfo.setWechatSecondCategory(industryMapInfo.getDestCatalogCd().trim());
        //企业注册类型
        wechatMchntInfo.setWechatMchntType(mchntBaseInfo.getMchntNature());
        //00-入驻申请中 01-入驻成功 02-入驻失败
        wechatMchntInfo.setWechatEntryFlag("00");
        //实名认证标识 默认N
        wechatMchntInfo.setRealNameFlag(BompAppParamConstant.FLAG_N);
        //记录状态
        wechatMchntInfo.setRecordStatus(BompAppParamConstant.FLAG_Y);
        wechatMchntInfo.setAppId(appId);
        wechatMchntInfo.setAppSecretKey(appKey);
        wechatMchntInfo.setMiniAppId(miniAppId);
        wechatMchntInfo.setMiniSecretKey(miniAppKey);
        wechatMchntInfo.setIndependentEntryFlag(independentEntryFlag);
        wechatMchntInfo.setAuditStatus(auditStatus);
        wechatMchntInfo.setOprId(request.getUserId());
        wechatMchntInfo.setCreateTime(createTime);
        wechatMchntInfo.setDstChannelType(request.getWechatChannelId());

        return wechatMchntInfo;
    }

    /**
     * 初始化支付宝商户信息表 商户入驻时使用
     *
     * @param request 商户产品新增请求
     */
    public static AlipayMchntInfo initAlipayMchntInfoByCreate(MchntProdInfoManageRequest request,
                                                              MchntBaseInfo mchntBaseInfo,
                                                              IndustryMapInfo industryMapInfo,
                                                              String auditStatus,
                                                              String createTime) {
        AlipayMchntInfo alipayMchntInfo = new AlipayMchntInfo();
        alipayMchntInfo.setId(RandomUtil.getUUID());
        alipayMchntInfo.setInstId(request.getHeader().getInstId());
        alipayMchntInfo.setMchntNo(request.getMchntNo());
        alipayMchntInfo.setDstChannelType(request.getAlipayChannelId());

        //支付宝类目
        alipayMchntInfo.setAlipayCategory(industryMapInfo.getDestCatalogCd().trim());
        //支付宝商户类型 01-小微，02-个体，03-企业，04-事业单位
        alipayMchntInfo.setAlipayMchntType(mchntBaseInfo.getMchntNature());
        //支付宝入驻状态 00-入驻申请中 01-入驻成功 02-入驻失败
        alipayMchntInfo.setAlipayEntryFlag("00");
        //特殊费率申请标志 默认N  0-未申请
        alipayMchntInfo.setSpecialRateApplyFlag("0");

        //记录状态
        alipayMchntInfo.setRecordStatus(BompAppParamConstant.FLAG_Y);
        alipayMchntInfo.setAuditStatus(auditStatus);
        alipayMchntInfo.setOprId(request.getUserId());
        alipayMchntInfo.setCreateTime(createTime);

        return alipayMchntInfo;
    }


    /**
     * 初始化银联商户信息表 商户入驻时使用
     * T_B_CUPS_MCHNT_INFO
     *
     * @param request 商户产品新增请求
     */
    public static CupsMchntInfo initCupsMchntInfoByCreate(MchntProdInfoManageRequest request,
                                                          MchntBaseInfo mchntBaseInfo,
                                                          String cupsInstCode,
                                                          String cupsArea,
                                                          String auditStatus,
                                                          String createTime) {
        CupsMchntInfo cupsMchntInfo = new CupsMchntInfo();
        cupsMchntInfo.setId(RandomUtil.getUUID());
        cupsMchntInfo.setInstId(request.getHeader().getInstId());
        cupsMchntInfo.setMchntNo(request.getMchntNo());
        cupsMchntInfo.setCupsMchntNo(request.getMchntNo());

        //银联MCC
        cupsMchntInfo.setCupsMcc(mchntBaseInfo.getIndustryType());
        //银联机构代码 获取法人行对应的SYS_PARAM表中的银联机构号
        cupsMchntInfo.setCupsInstCode(cupsInstCode);
        //银联地区代码
        cupsMchntInfo.setCupsAreaCode(cupsArea);
        //是否启用非标价格商户 默认N
        cupsMchntInfo.setStandardPriceFlag(BompAppParamConstant.FLAG_N);
        //是否是银联特殊计费商户 默认N
        cupsMchntInfo.setSpecialMchntFlag(BompAppParamConstant.FLAG_N);
        //银联报备状态 默认 0-未申请
        cupsMchntInfo.setCupsReportStatus("00");

        //记录状态
        cupsMchntInfo.setRecordStatus(BompAppParamConstant.FLAG_Y);
        cupsMchntInfo.setAuditStatus(auditStatus);
        cupsMchntInfo.setOprId(request.getUserId());
        cupsMchntInfo.setCreateTime(createTime);
        return cupsMchntInfo;
    }

    public static void savemchntApexInfo(MchntBaseInfo mchntBaseInfo, List<MchntApexInfoBean> mchntApexInfoBeanList) throws Exception {
        if (CollectionUtils.isEmpty(mchntApexInfoBeanList)) {
            return;
        }
        BizTmpMapper bizTmpMapper = new BizTmpMapperImpl();
        MchntApexInfoMapper mchntApexInfoMapper = new MchntApexInfoMapperImpl();

        boolean isNormalMchnt = MchntStatusEnum.NORMAL.getStatus().equals(mchntBaseInfo.getMchntStatus());
        for (MchntApexInfoBean mchntApexInfoBean : mchntApexInfoBeanList) {
            String bizTmpRealId = mchntBaseInfo.getMchntNo() + mchntApexInfoBean.getPropertyKey();
            boolean isNewMchntSys = false;
            BizTmp bizTmp = bizTmpMapper.selectBizTmpByRealId(mchntBaseInfo.getInstId(), bizTmpRealId);
            MchntApexInfo mchntApexInfo;
            if (null == bizTmp) {
                isNewMchntSys = true;
                mchntApexInfo = initMchntApexInfo(mchntBaseInfo, mchntApexInfoBean);
                bizTmp = initBizTmpInfo(mchntBaseInfo, TableNameConstant.T_B_MCHNT_APEX_INFO, BompBizOprEnum.INSERT.getBizOprCode(), mchntBaseInfo);
                bizTmp.setRealId(bizTmpRealId);
                bizTmp.setOprId(mchntBaseInfo.getLastOprId());
                bizTmp.setCreateTime(mchntBaseInfo.getLastUpdateTime());
            } else {
                mchntApexInfo = JSONObject.parseObject(getJsonString(bizTmp), MchntApexInfo.class);
                bizTmp.setLastOprId(mchntBaseInfo.getLastOprId());
                bizTmp.setLastUpdateTime(mchntBaseInfo.getLastUpdateTime());
            }

            if (StringUtil.isEmptyOrNull(mchntApexInfoBean.getPropertyStatus())) {
                mchntApexInfoBean.setPropertyStatus(AppParamConstant.YES);
            }

            mchntApexInfo.setPropertyValue(mchntApexInfoBean.getPropertyValue());
            mchntApexInfo.setPropertyStatus(mchntApexInfoBean.getPropertyStatus());
            mchntApexInfo.setLastUpdateTime(mchntBaseInfo.getLastUpdateTime());
            initBizTempData(bizTmp, JSONObject.toJSONString(mchntApexInfo));

            int dbResult;
            if (isNewMchntSys) {
                dbResult = bizTmpMapper.insertBizTmp(bizTmp);
            } else {
                dbResult = bizTmpMapper.updateBizTmpByRealId(bizTmp);
            }
            if (0 != dbResult) {
                throw new BizException(RespCodeEnum.SYSTEM_BUSYNESS.getRespCode(), RespCodeEnum.SYSTEM_BUSYNESS.getRespDesc());
            }

            if (isNewMchntSys) {
                if (isNormalMchnt) {
                    mchntApexInfo.setPropertyStatus(AppParamConstant.NO);
                }
                dbResult = mchntApexInfoMapper.insertMchntApexInfo(mchntApexInfo);
            } else {
                if (!isNormalMchnt) {
                    dbResult = mchntApexInfoMapper.updateMchntApexInfoByPrimaryKey(mchntApexInfo);
                }
            }
            if (0 != dbResult) {
                throw new BizException(RespCodeEnum.SYSTEM_BUSYNESS.getRespCode(), RespCodeEnum.SYSTEM_BUSYNESS.getRespDesc());
            }
        }
    }

    public static MchntApexInfo initMchntApexInfo(MchntBaseInfo mchntBaseInfo, MchntApexInfoBean mchntApexInfoBean) {
        MchntApexInfo mchntApexInfo = new MchntApexInfo();
        mchntApexInfo.setInstId(mchntBaseInfo.getInstId());
        mchntApexInfo.setMchntNo(mchntBaseInfo.getMchntNo());
        mchntApexInfo.setPropertyKey(mchntApexInfoBean.getPropertyKey());
        mchntApexInfo.setPropertyValue(mchntApexInfoBean.getPropertyValue());
        mchntApexInfo.setPropertyStatus(mchntApexInfoBean.getPropertyStatus());
        mchntApexInfo.setPropertyDesc(mchntApexInfoBean.getPropertyDesc());
        mchntApexInfo.setEffectiveDate(mchntApexInfoBean.getEffectiveDate());
        mchntApexInfo.setExpiryDate(mchntApexInfoBean.getExpiryDate());
        if (StringUtil.isEmptyOrNull(mchntApexInfo.getExpiryDate())) {
            mchntApexInfo.setExpiryDate("20991231");
        }
        mchntApexInfo.setId(RandomUtil.getUUID());
        mchntApexInfo.setOprId(mchntBaseInfo.getOprId());
        mchntApexInfo.setCreateTime(mchntBaseInfo.getLastUpdateTime());
        return mchntApexInfo;
    }

    public static BizTmp initBizTmpByCreate(MchntBaseInfo mchntBaseInfo,
                                            String id,
                                            String jsonString,
                                            String tableName,
                                            String auditStatus,
                                            String masterShowFlag,
                                            String detailFlag) {
        BizTmp bizTmp = new BizTmp();
        BeanUtil.beanCopy(mchntBaseInfo, bizTmp);
        bizTmp.setManageInstId(mchntBaseInfo.getSignInstId());
        bizTmp.setRealId(id);
        bizTmp.setOprTableEname(tableName);
        //状态非正式
        bizTmp.setBizStatus(BizTmpStatusEnum.NO_NORMAL.getType());
        //新增
        bizTmp.setBizOpr("I");
        bizTmp.setAuditStatus(auditStatus);
        //主记录标识
        bizTmp.setDetailFlag(detailFlag);
        bizTmp.setMasterShowFlag(masterShowFlag);
        bizTmp.setMasterKey(mchntBaseInfo.getId());
        InitParamUtil.initBizTempData(bizTmp, jsonString);
        return bizTmp;
    }


    public static String getJsonString(BizTmp bizTmp) {
        String tmpInfoJson = StringUtil.isEmptyOrNull(bizTmp.getBizData2()) ? bizTmp.getBizData1() : bizTmp.getBizData1() + bizTmp.getBizData2();
        tmpInfoJson = StringUtil.isEmptyOrNull(bizTmp.getBizData3()) ? tmpInfoJson : tmpInfoJson + bizTmp.getBizData3();
        return tmpInfoJson;
    }


    public static String getDstChannelTypeByTxnGroup(String baseProdCode, String txnGroup) {
        String dstChannelType = "";
        if ("2200".equals(txnGroup)) {
            //代收类 CT0?
            dstChannelType = "CT0";
        } else if ("2300".equals(txnGroup)) {
            //代付类 PT0?
            dstChannelType = "PT0";
        } else if ("2000".equals(txnGroup) && BaseProdEnum.BANK_CARD_PAY.getProdCode().equals(baseProdCode)) {
            //快捷支付 银行卡支付 TK0?
            dstChannelType = "TK0";
        } else if ("2000".equals(txnGroup) && BaseProdEnum.CUPS_CLOUD_PAY.getProdCode().equals(baseProdCode)) {
            //快捷支付 云闪付 GW0?
            dstChannelType = "GW0";
        } else if ("2100".equals(txnGroup) && BaseProdEnum.BANK_CARD_PAY.getProdCode().equals(baseProdCode)) {
            //网关支付 银行卡支付 GW0?/BB
            dstChannelType = "GW0";
        }

        return dstChannelType;
    }


    public static boolean isCoreBankType(String acctType) {
        /* step1: 校验是否为本行卡 */
        return SettleAcctTypeEnum.SELF_DEBIT.getAcctType().equals(acctType)
                || SettleAcctTypeEnum.SELF_CREDIT.getAcctType().equals(acctType)
                || SettleAcctTypeEnum.SELFT_PASSBOOK.getAcctType().equals(acctType)
                || SettleAcctTypeEnum.SELF_INTERNAL.getAcctType().equals(acctType)
                || SettleAcctTypeEnum.SELF_PUBLIC.getAcctType().equals(acctType);
    }

    //region 商户图片管理

    /**
     * 影像管理通用方法
     * <p/>
     * 调用前需开启MCMP数据库事务,并且以try-catch包裹,同时建议提前判断mchntImageInfoBeanList是否为空,非空时传入
     *
     * @param mchntBaseInfo          商户基本信息
     * @param mchntImageInfoBeanList 上送影像List
     * @param imageTypes             [,]分割的预处理影像类型
     * @throws Exception 异常
     */
    public static void manageMchntImage(MchntBaseInfo mchntBaseInfo, List<MchntImageInfoBean> mchntImageInfoBeanList, String imageTypes) throws Exception {
        RgLogger rglog = RgLog.getLogger(InitParamUtil.class.getSimpleName());
        //idMap,初始将临时表中有效的数据存在的放入map,key存放影像的ID,value为0表示临时表中存在的;为1表示上送信息中存在的ID
        Map<String, String> idMap = new HashMap<>();
        //转换数据库影像信息,非正式商户并更新至正式表
        List<MchntImageInfo> mchntImageInfoList = mchntImageInfoBeanListChangeToMchntImageInfoList(mchntBaseInfo, mchntImageInfoBeanList, imageTypes, idMap, rglog);
        //转换临时表
        List<BizTmp> bizTmpList = initBizTmpMchntImageInfo(mchntBaseInfo, mchntImageInfoList, rglog);
        rglog.debug("数据转换临时表成功.");
        //刷新临时表
        refreshBizTmp(mchntBaseInfo, bizTmpList, idMap, rglog);
    }

    /**
     * 将上送图片转换为一个列表处理
     *
     * @param mchntBaseInfo          商户基本信息
     * @param mchntImageInfoBeanList 请求对象
     * @param imageTypes             [,]分割的预处理影像类型
     * @throws Exception 异常
     */
    private static List<MchntImageInfo> mchntImageInfoBeanListChangeToMchntImageInfoList(MchntBaseInfo mchntBaseInfo, List<MchntImageInfoBean> mchntImageInfoBeanList, String imageTypes, Map<String, String> idMap, RgLogger rglog) throws Exception {
        List<MchntImageInfo> mchntImageInfoList = new ArrayList<>();

        //查询库中数据
        MchntImageInfoMapper mchntImageInfoMapper = new MchntImageInfoMapperImpl();
        List<MchntImageInfo> dbMchntImageInfoList = mchntImageInfoMapper.selectMchntImageInfoByMchntNo(mchntBaseInfo.getInstId(), mchntBaseInfo.getMchntNo());
        if (null == dbMchntImageInfoList) {
            //预防空指针
            dbMchntImageInfoList = new ArrayList<>();
        }
        BizTmpMapper bizTmpMapper = new BizTmpMapperImpl();
        List<BizTmp> dbBizTmpList = bizTmpMapper.selectBizTmpByMchntNo(mchntBaseInfo.getInstId(), mchntBaseInfo.getMchntNo(), TableNameConstant.T_B_MCHNT_IMAGE_INFO);
        if (CollectionUtils.isEmpty(dbBizTmpList)) {
            dbBizTmpList = new ArrayList<>();
        }

        for (BizTmp bizTmp : dbBizTmpList) {
            MchntImageInfo mchntImageInfo = JSONObject.parseObject(InitParamUtil.getJsonString(bizTmp), MchntImageInfo.class);
            if ("Y".equals(mchntImageInfo.getRecordStatus()) && imageTypes.contains(mchntImageInfo.getImageType())) {
                idMap.put(bizTmp.getRealId(), "0");
            }
        }

        for (MchntImageInfoBean mchntImageInfoBean : mchntImageInfoBeanList) {
            List<ImageInfoBean> imageInfoBeanList = mchntImageInfoBean.getImageInfoList();
            if (CollectionUtils.isEmpty(imageInfoBeanList)) {
                rglog.error("管理商户影像信息失败, 影像信息参数为空！imageType:{}", mchntImageInfoBean.getImageType());
                // throw new BizException(RespCodeEnum.PARAM_ERROR.getRespCode(), RespCodeEnum.PARAM_ERROR.getRespDesc());
                continue;
            }
            for (ImageInfoBean imageInfoBean : imageInfoBeanList) {
                /*开始处理单张图片*/
                MchntImageInfo mchntImageInfo = mchntImageInfoBeanChangeToMchntImageInfo(mchntBaseInfo, dbMchntImageInfoList, dbBizTmpList, mchntImageInfoBean.getImageType(), imageInfoBean, rglog);
                mchntImageInfoList.add(mchntImageInfo);
                idMap.put(mchntImageInfo.getId(), "1");
            }
        }
        return mchntImageInfoList;
    }

    /**
     * 上送影像信息转数据库影像信息
     *
     * @param mchntBaseInfo        商户基本信息
     * @param dbMchntImageInfoList 数据库影像信息列表
     * @param dbBizTmpList         数据库影像信息临时表
     * @param imageType            影像类型
     * @param imageInfoBean        单个影像信息
     * @return 数据库影像信息
     * @throws Exception 异常
     */
    private static MchntImageInfo mchntImageInfoBeanChangeToMchntImageInfo(MchntBaseInfo mchntBaseInfo, List<MchntImageInfo> dbMchntImageInfoList, List<BizTmp> dbBizTmpList, String imageType, ImageInfoBean imageInfoBean, RgLogger rglog) throws Exception {
        String id;//图片ID
        boolean isNewImage;//是否为新增图片
        String userId = mchntBaseInfo.getLastOprId();
        if (StringUtil.isEmptyOrNull(imageInfoBean.getImageLocalPath())) {
            rglog.error("上送影像信息ID<{}>,imageType<{}>,imageIndex<{}>,未上送图片本地存储路径.", imageInfoBean.getId(), imageType, imageInfoBean.getImageIndex());
            throw new BizException(RespCodeEnum.SYSTEM_BUSYNESS.getRespCode(), RespCodeEnum.SYSTEM_BUSYNESS.getRespDesc());
        }
        rglog.debug("ID<{}>,imageType<{}>,index<{}>,imageLocalPath<{}>",
                imageInfoBean.getId(), imageType, imageInfoBean.getImageIndex(), new String(Base64.decodeBase64(imageInfoBean.getImageLocalPath())));

        /*影像信息*/
        MchntImageInfo mchntImageInfo = new MchntImageInfo();
        BeanUtil.beanCopy(mchntBaseInfo, mchntImageInfo);

        List<MchntImageInfo> filterMchntImageInfoList = dbMchntImageInfoList.stream().filter(item -> item.getImageType().equals(imageType) && item.getImageIndex() == Integer.parseInt(imageInfoBean.getImageIndex())).collect(Collectors.toList());
        if (CollectionUtils.isEmpty(filterMchntImageInfoList)) {
            //正式表没有imageType和imageIndex相同的数据,新增图片,获取新ID
            isNewImage = true;
            id = RandomUtil.getUUID();
            rglog.debug("新增图片ID<{}>", id);
            mchntImageInfo.setId(id);
            mchntImageInfo.setOprId(userId);
            mchntImageInfo.setCreateTime(mchntBaseInfo.getLastUpdateTime());
        } else {
            //已有ID,存在数据
            isNewImage = false;
            id = filterMchntImageInfoList.get(0).getId();
            MchntImageInfo origMchntImageInfo;//原商户影像信息
            List<BizTmp> bizTmpList = dbBizTmpList.stream().filter(item -> item.getRealId().equals(id)).collect(Collectors.toList());
            if (CollectionUtils.isEmpty(bizTmpList)) {
                List<MchntImageInfo> imageInfoList = dbMchntImageInfoList.stream().filter(item -> item.getId().equals(imageInfoBean.getId())).collect(Collectors.toList());
                if (CollectionUtils.isEmpty(imageInfoList)) {
                    rglog.error("正式表无ID为<{}>的正式表数据", id);
                    throw new BizException(RespCodeEnum.SYSTEM_BUSYNESS.getRespCode(), RespCodeEnum.SYSTEM_BUSYNESS.getRespDesc());
                }
                origMchntImageInfo = imageInfoList.get(0);
            } else {
                origMchntImageInfo = JSONObject.parseObject(InitParamUtil.getJsonString(bizTmpList.get(0)), MchntImageInfo.class);
            }

            BeanUtil.beanCopy(origMchntImageInfo, mchntImageInfo);
        }

        BeanUtil.beanCopy(imageInfoBean, mchntImageInfo);
        mchntImageInfo.setId(id);//ID赋值
        if (StringUtil.isEmptyOrNull(imageInfoBean.getRecordStatus())) {
            //默认有效
            mchntImageInfo.setRecordStatus(AppParamConstant.YES);
        } else {
            mchntImageInfo.setRecordStatus(imageInfoBean.getRecordStatus());
        }

        mchntImageInfo.setImageType(imageType);
        mchntImageInfo.setImageLocalPath(new String(Base64.decodeBase64(imageInfoBean.getImageLocalPath())));
        if (!StringUtil.isEmptyOrNull(imageInfoBean.getImagePath())) {
            mchntImageInfo.setImageRemotePath(new String(Base64.decodeBase64(imageInfoBean.getImagePath())));
        }
        mchntImageInfo.setWechatMediaId(imageInfoBean.getWechatImageId());
        mchntImageInfo.setImageDesc(imageInfoBean.getImageDesc());

        MchntImageInfoMapper mchntImageInfoMapper = new MchntImageInfoMapperImpl();
        if (MchntStatusEnum.NORMAL.getStatus().equals(mchntBaseInfo.getMchntStatus())) {
            if (isNewImage) {
                //新增图片还需要登记至正式表,
                MchntImageInfo dbMchntImageInfo = new MchntImageInfo();
                BeanUtil.beanCopy(mchntImageInfo, dbMchntImageInfo);
                dbMchntImageInfo.setRecordStatus(AppParamConstant.NO);
                int insertResult = mchntImageInfoMapper.insertMchntImageInfo(dbMchntImageInfo);
                if (0 != insertResult) {
                    rglog.error("新增数据<{}>到正式表失败.", dbMchntImageInfo.getId());
                    throw new BizException(RespCodeEnum.SYSTEM_BUSYNESS.getRespCode(), RespCodeEnum.SYSTEM_BUSYNESS.getRespDesc());
                }
            }
        } else if (MchntStatusEnum.UNNORMAL.getStatus().equals(mchntBaseInfo.getMchntStatus())) {
            //非正式商户(新增流程中),还需要将影像信息新增/更新至正式表,并且记录状态为有效
            MchntImageInfo dbMchntImageInfo = new MchntImageInfo();
            BeanUtil.beanCopy(mchntImageInfo, dbMchntImageInfo);
            if (isNewImage) {
                int insertResult = mchntImageInfoMapper.insertMchntImageInfo(dbMchntImageInfo);
                if (0 != insertResult) {
                    rglog.error("新增数据<{}>到正式表失败.", dbMchntImageInfo.getId());
                    throw new BizException(RespCodeEnum.SYSTEM_BUSYNESS.getRespCode(), RespCodeEnum.SYSTEM_BUSYNESS.getRespDesc());
                }
            } else {
                int updateResult = mchntImageInfoMapper.updateMchntImageInfoById(dbMchntImageInfo);
                if (0 != updateResult) {
                    rglog.error("更新数据<{}>到正式表失败.", dbMchntImageInfo.getId());
                    throw new BizException(RespCodeEnum.SYSTEM_BUSYNESS.getRespCode(), RespCodeEnum.SYSTEM_BUSYNESS.getRespDesc());
                }
            }
        }

        return mchntImageInfo;
    }

    /**
     * 将上送影像信息转换为临时表影像信息
     *
     * @param mchntBaseInfo      商户基本信息
     * @param mchntImageInfoList 上送图片列表
     * @return 操作完成后的临时表信息
     * @throws Exception 异常
     */
    private static List<BizTmp> initBizTmpMchntImageInfo(MchntBaseInfo mchntBaseInfo, List<MchntImageInfo> mchntImageInfoList, RgLogger rglog) throws Exception {
        List<BizTmp> bizTmpList = new ArrayList<>();
        for (MchntImageInfo mchntImageInfo : mchntImageInfoList) {
            rglog.debug("准备将ID<{}>,imageType<{}>,index<{}>,imageLocalPath<{}>转为临时表数据.",
                    mchntImageInfo.getId(), mchntImageInfo.getImageType(), mchntImageInfo.getImageIndex(), (mchntImageInfo.getImageLocalPath()));
            BizTmp bizTmp = new BizTmp();
            ConvertUtil.convertOutput(bizTmp);
            BeanUtil.beanCopy(mchntImageInfo, bizTmp);
            bizTmp.setRealId(mchntImageInfo.getId());
            bizTmp.setManageInstId(mchntBaseInfo.getSignInstId());
            bizTmp.setOprTableEname(TableNameConstant.T_B_MCHNT_IMAGE_INFO);
            bizTmp.setAuditStatus(mchntBaseInfo.getAuditStatus());//跟基本信息审核状态相同
            if (mchntBaseInfo.getLastUpdateTime().equals(mchntImageInfo.getCreateTime())) {
                //创建时间为当前时间(与基本信息的最后更新时间相同),说明是新增图片
                bizTmp.setBizOpr("I");
            } else {
                bizTmp.setBizOpr("U");
            }

            bizTmp.setBizStatus(BizTmpStatusEnum.NO_NORMAL.getType());
            bizTmp.setMasterShowFlag(BompAppParamConstant.FLAG_N);
            bizTmp.setMasterKey(mchntBaseInfo.getId());
            bizTmp.setDetailFlag(BompAppParamConstant.FLAG_Y);
            bizTmp.setMchntName(mchntBaseInfo.getMchntName());
            String mchntImageInfoJson = JSONObject.toJSONString(mchntImageInfo);
            InitParamUtil.initBizTempData(bizTmp, mchntImageInfoJson);
            bizTmpList.add(bizTmp);
        }
        return bizTmpList;
    }

    //endregion
}
